package br.com.virtual.vender.service.impl;

import java.math.BigDecimal;
import java.net.URL;
import java.util.Calendar;

import javax.ejb.EJB;
import javax.ejb.Local;
import javax.ejb.Stateless;
import javax.inject.Inject;

import br.com.uol.pagseguro.domain.AccountCredentials;
import br.com.uol.pagseguro.domain.Currency;
import br.com.uol.pagseguro.domain.Item;
import br.com.uol.pagseguro.domain.PaymentRequest;
import br.com.uol.pagseguro.exception.PagSeguroServiceException;
import br.com.virtual.base.enums.FormaPagamentoEnum;
import br.com.virtual.base.enums.StatusVendaEnum;
import br.com.virtual.base.exceptions.VirtualValidationException;
import br.com.virtual.base.service.SenderEmail;
import br.com.virtual.base.uteis.FileManager;
import br.com.virtual.base.uteis.VirtualConstants;
import br.com.virtual.vender.dao.PagamentoDAO;
import br.com.virtual.vender.model.ItemVenda;
import br.com.virtual.vender.model.Pagamento;
import br.com.virtual.vender.model.Venda;
import br.com.virtual.vender.service.PagamentoService;
import br.com.virtual.vender.service.VendaService;

@Stateless
@Local(PagamentoService.class)
public class PagamentoServiceImpl implements PagamentoService, VirtualConstants {

	@Inject private PagamentoDAO pagamentoDAO;
	
	@EJB private SenderEmail senderEmail;
	@EJB private VendaService vendaService;
	
	@Override
	public Pagamento gerarPagamento(Venda venda) {

		PaymentRequest requestPagSeguro = new PaymentRequest();
		requestPagSeguro.setCurrency(Currency.BRL);

		// Adicionar referência da venda.
		requestPagSeguro.setReference(venda.getId().toString());

		for (ItemVenda iv : venda.getItens()) {

			Item item = new Item();

			// id do produto.
			item.setId(iv.getProduto().getId().toString());
			// Descrição do produto.
			item.setDescription(iv.getProduto().getNome());
			// Qunatidade
			item.setQuantity(iv.getQuantidade());

			// Preço unitário.

			item.setAmount(new BigDecimal(String.format("%.2f",
					iv.getProduto().getPreco_venda_desconto())
					.replace(",", ".")));

			requestPagSeguro.addItem(item);

		}

		requestPagSeguro.setShippingCost(new BigDecimal( venda.getTotalFrete()));
		// Comprador
		requestPagSeguro.setSender(venda.getCliente().getNome(), venda
				.getCliente().getEmail());

		// Sets redirectURL
//		requestPagSeguro.setRedirectURL(PAGSEGURO_URL_RETORNO);

		try {
			// Register this payment request in PagSeguro, to obtain the payment
			// URL for redirect your customer.
			URL paymentURL = requestPagSeguro.register(new AccountCredentials(
					PAGSEGURO_EMAIL, PAGSEGURO_TOKEN));
//			System.out.println(paymentURL);

			return this.criarPagamento(venda, paymentURL.toString());

		} catch (PagSeguroServiceException e) {
			System.err.println(e.toString());
			e.printStackTrace();

			return null;
		}

	}
	
	private Pagamento criarPagamento(Venda venda, String urlPagamento){
	
		Pagamento pagamento = new Pagamento();
		pagamento.setFormaDePagamento(FormaPagamentoEnum.PAG_SEGURO);
		pagamento.setTotalPagamento(venda.getTotalVenda());	
		pagamento.setLinkPagamento(urlPagamento);
		pagamento.setVenda(venda);
		
		return pagamentoDAO.create(pagamento);
	}

	@Override
	public boolean isPagamentoRealizado(Venda venda) {

		if(venda.getStatus().equals(StatusVendaEnum.AGUARDANDO_PAGAMENTO)){
			
			String linhaLida = new FileManager(CAMINHO_RETORNO).getPrimeiraLinhaArquivo(venda.getId().toString());
			if(linhaLida == null || !linhaLida.equals("true"))
				return false;
		}
		
		return true;
	}
	
	@Override
	public Venda validarPagamento(Venda venda){
		
		if(venda.getStatus().equals(StatusVendaEnum.AGUARDANDO_PAGAMENTO) && isPagamentoRealizado(venda) ){
			
			venda.setStatus(StatusVendaEnum.EMITINDO_NF);
			venda.setItens(vendaService.getItens(venda));
			
			this.senderEmail.sendVendaStatusAlterado(venda.getCliente().getEmail(), venda.getCliente().getNome(), 
					venda.getId().toString(), venda.getStatus());
			
			
			try {
				vendaService.update(venda);
				Pagamento pagamento = venda.getPagamento();
				pagamento.setDataPagamento(Calendar.getInstance());
				pagamentoDAO.update(pagamento);
				
			} catch (VirtualValidationException e) {
				e.printStackTrace();
			}
			
		}
		return venda;
	}
}
